<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 传值和传址；

      // 简单数据类型 传值；
      // var a = 10;
      // var b = a;
      // b = 20;
      // console.log(a);

      // 复杂数据类型 传址；
      // var a = {
      //     num:10
      // }

      // var b = a;
      // b.num = 20;
      // console.log(a);

      // 不希望 传址 。数据之间出现 引用；
      // 如何解决 ？？ 深拷贝；
      // 1.json 可以做深拷贝；
      // json 深拷贝缺点 ：1.忽略  undefined 2.会忽略 函数 3. 会忽略 map 及set 数据；
      // 丢失 undefined 函数 map 和set；

      // var a = {
      //     num:10,
      //     key:undefined,
      //     fn(){
      //         console.log("fn");
      //     },
      //     map:new Map()
      // }
      // console.log(a);
      // // 通过json转换
      // var b = JSON.parse(JSON.stringify(a));
      // console.log(b);
      // b.num = 20;
      // console.log(a);

      // 2.通过递归来实现深拷贝；

      // 创建一个新的对象；
      // let temp = {};
      // // 把a里的内容 放在新的 temp里；
      // for(let key in a){
      //     temp[key] = a[key];
      // }
      // // console.log(temp);
      // temp.num = 20;
      // console.log(a);
      let a = {
        num: 10,
        obj: {
          age: 30,
        },
      };
      // let a = ["张三","李四"];

      function deepCopy(obj) {
        // let temp = {};
        // console.log(Object.prototype.toString.call(obj))
        let temp =
          Object.prototype.toString.call(obj) == "[object Object]" ? {} : [];
        for (let key in obj) {
          // 1.a['num']= 10;
          // 2.a['obj'] = {age:30};---->进入if  ---->  {age:30}传入 deepCopy ---》进入else --->赋值temp[age] = 30-->temp['obj'] = {age:30}
          if (typeof obj[key] == "object") {
            temp[key] = deepCopy(obj[key]);
          } else {
            temp[key] = obj[key];
          }
        }
        return temp;
      }

      let b = deepCopy(a);
      // console.log(b);
      // b.num = 20;
      // console.log(a);
      b.obj.age = 20;
      console.log(a);

      // let b = a;
      // b.num = 20;
      // console.log(a);
    </script>
  </body>
</html>
